home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’97 / Jasik Park - The Lost UI / JasikAppearance / JasikWIND.cpp < prev   
C/C++ Source or Header  |  1997-06-28  |  7KB  |  267 lines

  1. // *****************************************************************************
  2. //
  3. //    InfinityWindoid.c
  4. //
  5. // —————————————————————————————————————————————————————————————————————————————
  6. //    Copyright © 1991-94 Infinity Systems.  All rights reserved.
  7. // —————————————————————————————————————————————————————————————————————————————
  8. //    DESCRIPTION:
  9. //        This file contains the main source for a WDEF (Window Definition)
  10. //        resource. It provides a ‘windoid’ appearance for use on floating windows. 
  11. //                
  12. //        See the file ‘About Infinity Windoid’ for more information and a list
  13. //        of features this WDEF supports.
  14. // —————————————————————————————————————————————————————————————————————————————
  15. //    WRITTEN BY:
  16. //        Troy Gaul, Infinity Systems
  17. //
  18. //    HOW TO CONTACT THE AUTHOR:
  19. //        Send e-mail to: tgaul@halcyon.com
  20. //                    or: tgaul@aol.com
  21. //                    or: tgaul@eworld.com
  22. // *****************************************************************************
  23.  
  24. #include <Memory.h>
  25. #include <ToolUtils.h>
  26. #include <Types.h>
  27. #include <Icons.h>
  28. #include <QuickDraw.h>
  29. #include <Windows.h>
  30.  
  31.  
  32. #include "SetupA4.h"
  33. #include "A4Stuff.h"
  34.  
  35. #define ASSERT(cond) do{if(!cond) DebugStr("\p" #cond);}while(false)
  36. #define VERIFY(cond) do{if(!cond) DebugStr("\p" #cond);}while(false)
  37. #define OS_VERIFY(func) do{OSErr err = (func); ASSERT(err == noErr);}while(false)
  38.  
  39. const short kIconLocked = -835;
  40. const short kIconUnlocked = -836;
  41.  
  42. const long kWindowUnlockedFlag = 0x8000;
  43.  
  44. static Boolean IsWindowLocked(WindowPeek window)
  45. {
  46.     // Only work on windows with aux handles
  47.     AuxWinHandle awHndl = NULL;
  48.     if(GetAuxWin((GrafPtr)window, &awHndl))
  49.     {
  50.         return ((awHndl[0]->awFlags & kWindowUnlockedFlag) == 0);         
  51.     }
  52.     
  53.     return false;
  54. }
  55.  
  56. static void SetWindowLock(WindowPeek window, Boolean locked)
  57. {
  58.     // Only work on windows with aux handles
  59.     AuxWinHandle awHndl = NULL;
  60.     if(GetAuxWin((GrafPtr)window, &awHndl))
  61.     {
  62.         if(locked)
  63.             awHndl[0]->awFlags &= ~kWindowUnlockedFlag;
  64.         else
  65.             awHndl[0]->awFlags |= kWindowUnlockedFlag;
  66.     }
  67. }
  68.  
  69. static Rect GetIconRect(WindowPeek window)
  70. {
  71.     // Get the struct rect
  72.     Rect structRect = (**window->strucRgn).rgnBBox;
  73.     Rect result = { structRect.top + 2, structRect.right - 42, structRect.top + 18, structRect.right - 26 };
  74.     return result;
  75. }
  76.     
  77.  
  78. // —————————————————————————————————————————————————————————————————————————————
  79. //
  80. //    SyncPorts
  81. //
  82. // —————————————————————————————————————————————————————————————————————————————
  83. //        Straight from the pages of _Macintosh Programming Secrets_, Second 
  84. //        Edition by Scott Knaster and Keith Rollin (page 425). (except that this
  85. //        version doesn’t check Gestalt, it will only be called if CQD is running)
  86. //        This routines was added to 2.3. It makes sure the drawing environment 
  87. //        is set correctly if the system has color. This is not needed for the 
  88. //        code in this WDEF as it is, but if a DoWDrawGIcon handler is implemented, 
  89. //        this is needed to make sure the drawing environment is set as Apple 
  90. //        tells us it will be for drawing the gray, xor’ed border.
  91. // —————————————————————————————————————————————————————————————————————————————
  92. static void 
  93. SyncPorts() 
  94. {
  95.     GrafPtr bwPort;
  96.     CGrafPtr colorPort;
  97.     
  98.     GetWMgrPort(&bwPort);
  99.     GetCWMgrPort(&colorPort);
  100.     SetPort((GrafPtr) colorPort);
  101.     
  102.     BlockMoveData(&bwPort->pnLoc, &colorPort->pnLoc, 10);
  103.     BlockMoveData(&bwPort->pnVis, &colorPort->pnVis, 14);
  104.     PenPat((ConstPatternParam) &bwPort->pnPat);
  105.     BackPat((ConstPatternParam) &bwPort->bkPat);
  106. }
  107.  
  108. static long 
  109. CallSystemWDEF0(short varCode, WindowPeek window, short message, long param)
  110. {
  111.     static Handle hSystemWDEF0 = NULL;
  112.     
  113.     if(!hSystemWDEF0)
  114.     {
  115.         // Load and lock down the original system WDEF 0
  116.         short    refNum = CurResFile();
  117.         
  118.         UseResFile ( 0 ); // system file
  119.         hSystemWDEF0 = Get1Resource ( 'WDEF', 0 );
  120.         UseResFile ( refNum );
  121.  
  122.         HLock(hSystemWDEF0);
  123.     }
  124.  
  125.     ASSERT(hSystemWDEF0);
  126.     ASSERT(*hSystemWDEF0);
  127.     
  128.     return ((WindowDefProcPtr)(*hSystemWDEF0))(varCode, (GrafPort*)window, message, param);
  129. }
  130.  
  131.  
  132. static void DrawLockBox(WindowPeek window, Boolean selected)
  133. {
  134.     // Calc the icon rect in top right
  135.     Rect iconRect = GetIconRect(window);
  136.     
  137.     short iconId = IsWindowLocked(window) ? kIconLocked : kIconUnlocked;
  138.     
  139.     IconTransformType trans = ttNone;
  140.     if(selected)
  141.         trans |= ttSelected;
  142.     
  143.     // Plot the icons
  144.     OS_VERIFY(PlotIconID(&iconRect, atNone, trans, iconId));
  145. }
  146.  
  147. static long 
  148. DoWindowHit(WindowPeek window, long param, long result) 
  149. {
  150.     Point hitPt;
  151.     
  152.     hitPt.v = HiWord(param);
  153.     hitPt.h = LoWord(param);
  154.     
  155.     switch(result)
  156.     {
  157.         case wInContent:
  158.         {
  159.             if(IsWindowLocked(window))
  160.                 result = wInDrag; // let the user grab and drag the content region
  161.         
  162.             break;
  163.         }
  164.             
  165.         case wInDrag:
  166.         {
  167.             // Calc the icon rect in top right
  168.             Rect iconRect = GetIconRect(window);
  169.             
  170.             if (PtInRect(hitPt, &iconRect))
  171.             {
  172.                 if(Button())
  173.                 {
  174.                     CGrafPtr colorPort;
  175.                     GetCWMgrPort(&colorPort);
  176.                     RgnHandle rgn = ::NewRgn();
  177.                     CopyRgn(colorPort->clipRgn, rgn);
  178.                     
  179.                     ClipRect(&iconRect);
  180.                     
  181.                     DrawLockBox(window, true);
  182.                     while(Button())
  183.                         /* nop - wait for mouse to be released */;
  184.                     SetWindowLock(window, !IsWindowLocked(window));
  185.                     DrawLockBox(window, false);
  186.                     // leave the result as wInDrag
  187.                     
  188.                     CopyRgn(rgn, colorPort->clipRgn);
  189.                     DisposeRgn(rgn);
  190.                 }
  191.             }
  192.         
  193.             break;
  194.         }
  195.     }
  196.     
  197.     return result;
  198. }
  199.  
  200. // —————————————————————————————————————————————————————————————————————————————
  201. //
  202. //    Windoid Main Function                                                     
  203. //
  204. // —————————————————————————————————————————————————————————————————————————————
  205. //        This is the main entry point for all calls to this code resource. It
  206. //        dispatches to routines that correspond to the message it is given.
  207. // —————————————————————————————————————————————————————————————————————————————
  208. pascal long 
  209. main(short varCode, WindowPeek window, short message, long param) 
  210. {
  211.     EnterCodeResource();    // Set up for globals    
  212.     PrepareCallback();
  213.     
  214.     long result = CallSystemWDEF0(varCode, window, message, param);
  215.  
  216.     // If we don't have an aux window rec, ignore this window
  217.     AuxWinHandle awHndl = NULL;
  218.     if(GetAuxWin((GrafPtr)window, &awHndl))
  219.     {
  220.         // Don't put locks on dialog windows
  221.         if(window->windowKind != dialogKind)
  222.         {
  223.             GrafPtr    savePort;
  224.             Boolean    needSyncPorts;
  225.             
  226.             // This sets up the appropriate drawing environment, but only for those
  227.             // messages for which we actually need to draw.
  228.             needSyncPorts = (message == wDraw 
  229.                           || message == wHit /*
  230.                           || message == wGrow
  231.                           || message == wDrawGIcon*/);
  232.             if (needSyncPorts) {
  233.                 GetPort(&savePort);
  234.                 SyncPorts();
  235.             }
  236.             
  237.             switch (message) {
  238.                 case wNew:
  239.                 case wDispose:    
  240.                 case wCalcRgns:    
  241.                 case wGrow:    
  242.                 case wDrawGIcon:
  243.                 default:
  244.                     break;    
  245.  
  246.                 case wDraw:
  247.                     DrawLockBox(window, false);
  248.                     break;
  249.                     
  250.                 case wHit:
  251.                     // filter the result
  252.                     result = DoWindowHit(window, param, result);
  253.                     break;
  254.             }
  255.             
  256.             if (needSyncPorts)
  257.                 SetPort(savePort);
  258.         }
  259.     }
  260.  
  261.     ExitCodeResource();        // Shutdown use of globals (A4).
  262.  
  263.     return result;
  264. }
  265.  
  266.  
  267.